home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / make / icmake-6.000 / icmake-6 / icmake / comp / gencode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-08  |  3.2 KB  |  121 lines

  1. /*
  2.                               G E N C O D E . C
  3. */
  4.  
  5. #include "iccomp.h"
  6.  
  7. void gencode(ESTRUC_ *e, OPCODE_ opcode, ...)
  8. {
  9.     register unsigned
  10.         index,
  11.         last;
  12.     int
  13.         marker_value;
  14.     unsigned
  15.         count;
  16.     va_list
  17.         marker;
  18.  
  19.     if (dead[dead_sp])
  20.         return;
  21.  
  22.     va_start(marker, opcode);
  23.  
  24.     lastop = opcode;                        /* remember last opcode */
  25.     outcode(e, opcode, sizeof(char));
  26.  
  27.     switch (opcode)
  28.     {
  29.         case op_jmp:                        /* write target to jump to */
  30.             switch ((JMP_COND_)va_arg(marker, JMP_COND_))
  31.             {
  32.                 case j_uncond:              /* absolute jumplocation */
  33.                     outcode(e, va_arg(marker, int), sizeof(INT16));
  34.                 break;
  35.  
  36.                 case j_truelist:
  37.                     patchtrue(e);           /* new truelist item */
  38.                 break;
  39.  
  40.                 case j_falselist:
  41.                     patchfalse(e);          /* new falselist item */
  42.                 break;
  43.             }
  44.         break;
  45.  
  46.         case op_jmp_false:                  /* write target to jump if false */
  47.             patchfalse(e);
  48.         break;
  49.  
  50.         case op_jmp_true:                   /* write target to jump if true */
  51.             patchtrue(e);
  52.         break;
  53.  
  54.         case op_push_strconst:              /* write index of the const */
  55.             outcode(e, stringtab[va_arg(marker, int)].index, sizeof(INT16));
  56.         break;
  57.  
  58.         case op_frame:
  59.             count = last = local.n_defined - n_params;
  60.             outcode(e, count, sizeof(char));
  61.             for (index = 0; index < last; index++)
  62.             {
  63.                 count = local.symbol[n_params + index].var.type & ALLTYPES;
  64.                 outcode(e, count, sizeof(char));
  65.             }
  66.         break;
  67.  
  68.         case op_copy_var:                   /* write # of the var. */
  69.         case op_push_imm:                   /* write value of the int */
  70.         case op_push_var:                   /* write # of the var. */
  71.         case op_dec:                        /* write # of the var. */
  72.         case op_inc:                        /* write # of the var. */
  73.         case op_call:                       /* write offset of function */
  74.             outcode(e, va_arg(marker, int), sizeof(INT16));
  75.         break;
  76.  
  77.         case op_asp:                        /* write # of args to remove */
  78.             marker_value = va_arg(marker, int);
  79.             if (!marker_value)              /* nothing to add to sp */
  80.                 e->codelen--;               /* opcode removed from code */
  81.         else
  82.                 outcode(e, marker_value, sizeof(char));
  83.         break;        
  84.  
  85.         case op_call_rss:                   /* write # of function */
  86.             outcode(e, va_arg(marker, int), sizeof(char));
  87.         break;
  88.  
  89.         case op_ret:
  90.         case op_exit:
  91.             ++dead[dead_sp];
  92.         break;
  93.  
  94. /*
  95.         following opcodes already out:
  96.  
  97.         op_pop_reg
  98.         op_push_reg
  99.         op_push_1_jmp_end
  100.         op_push_0
  101.         op_umin
  102.         op_atoi
  103.         op_itoa
  104.         op_atol
  105.         op_mul
  106.         op_div
  107.         op_mod
  108.         op_add
  109.         op_sub
  110.         op_eq
  111.         op_neq
  112.         op_sm
  113.         op_gr
  114.         op_younger
  115.         op_older
  116.         op_smeq
  117.         op_greq
  118. */
  119.     }
  120. }
  121.